/**
 * ===========================================================================
 * 版权所有 湖南免了么网络科技有限公司，并保留所有权利。
 * 网站地址: http://www.mianle.me
 * ===========================================================================
 * 10:38 2018/7/12
 */
package com.mianle.userapi.service.cglib;

import net.sf.cglib.beans.BeanGenerator;
import net.sf.cglib.beans.BeanMap;

import java.util.Map;

/**
 * @Author: yiyuan
 * @Description:
 * @Date: Created in 10:38 2018/7/12
 *
 */
public class DynamicGenerateBean {

    /**
     * 这只是个属性的载体;通过他产生子类对象;估计他也可以用我的的业务逻辑bean替代; 那么我们就做到了给我们的业务逻辑bean动态的添加属性了;
     */
    private Object object;
    /**
     *
     */
    private BeanMap beanMap;

    public DynamicGenerateBean(Map<String, Class> propertyMap) {
        super();
        this.object = this.generateBean(propertyMap);
        this.beanMap = BeanMap.create(this.object);
    }
    /**
     * 我觉得不应该提供默认的构造方法,要么就不要有有参的构造方法:
     * propertyMap:这个属性通过set方法注入;如果是我,我选择后者;

     public DynamicGenerateBean() {
     super();
     }
     */
    private Object generateBean(Map<String, Class> propertyMap) {
        BeanGenerator beanGenerator = new BeanGenerator();
        for (Map.Entry<String, Class> me : propertyMap.entrySet()) {
            // 给bean添加属性;即属性对应的类型;
            beanGenerator.addProperty(me.getKey(), me.getValue());
        }
        return beanGenerator.create();
    }

    public void setPropertyByName(String propertyName, Object value) {
        this.beanMap.put(propertyName, value);
    }

    public Object getPropertyByName(String propertyName) {
        return this.beanMap.get(propertyName);
    }
}
